import getRawBody from 'raw-body'
import * as util from './util'
import sha1 from 'sha1'

export default function (opts,reply){
    return async function wechatMiddle(ctx,next){       
            //获取配置参数中的token
            const token = opts.token
            //将请求参数中的数据解构赋值给相应的变量
            const {
                signature,
                timestamp,
                nonce,
                echostr
            } = ctx.query
            //按照微信的要求排序参数并生成排序后的字符串
            const str = [token,timestamp,nonce].sort().join('')
            //按照sha1加密
            const sha = sha1(str)
            //如果是GET请求，验证服务器
            if(ctx.method === 'GET')
            {
                //判断加密
                if (sha === signature)
                {
                   
                    ctx.body = echostr
                }
                else
                {
                    ctx.body = 'error signature is not happren'
                }
              
            }
            //如果是POST请求则进入微信回复逻辑
            else if (ctx.method === 'POST')
            {   
                if (sha !== signature){
                    ctx.body = 'Failed'
                    return false
                }
                //使用getRawBody解析出来请求体流中的数据，用一个buffer给保存起来
                //这里需要使用node的request，也就是ctx.req
                const data = await getRawBody(ctx.req,{
                    length:ctx.length,
                    limit:'1mb',
                    encoding:ctx.charset
                })
                //console.log(data.toString('utf-8'))
                //将data数据（xml）buffer格式化成js对象
                const content = await util.paresXML(data)
                console.log('content',content)
                //将发送过来的请求保存到ctx.wxreq
                //const message = util.formatMessage(content.xml)
                ctx.wxreq =content.xml
                //将ctx交给reply，处理回复逻辑，然后返回ctx
                await reply.apply(ctx,[ctx,next])
                //将改装好的ctx.body对象给replybody
                const replyBody = ctx.body
                //如果对象为空就不需要回复了
                if (!replyBody){return false}
                console.log('replyBody',replyBody)
                const msg = ctx.wxreq
                //将回复的对象格式转换成微信需要的XML格式
                const xml = util.tpl(replyBody,msg)
                console.log('xml:',xml)
                ctx.status = 200
                ctx.type = 'application/xml'
                ctx.body = xml
            }
        }
    }